package com.librelato.tela;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import org.primefaces.context.RequestContext;

import com.librelato.bean.ChamadoBean;
import com.librelato.bean.HistoricoBean;
import com.librelato.bean.TipoProblemaBean;
import com.librelato.bean.UsuarioBean;
import com.librelato.negocio.ChamadoServico;
import com.librelato.negocio.TipoProblemaServico;
import com.librelato.negocio.UsuarioServico;
import com.librelato.negocio.interfaces.IServicoGenerico;
import com.librelato.util.Ferramentas;

@ManagedBean
@ViewScoped
public class GerenciaChamadoTela extends TelaAbstrata {

	@ManagedProperty(value = "#{usuario}")
	private UsuarioBean usuario;

	private ChamadoServico<ChamadoBean> servico;

	private UsuarioServico<UsuarioBean> usuarioServico;

	private TipoProblemaServico<TipoProblemaBean> tipoServico;

	private ChamadoBean chamado;

	private List<ChamadoBean> chamadosNaoAprovados;

	private List<UsuarioBean> responsaveis;

	private Long responsavel;

	private TipoProblemaBean tipoProblema;

	private HistoricoBean historico;

	private List<ChamadoBean> chamadosAtendidos;

	private List<ChamadoBean> chamadosIniciar;

	private List<TipoProblemaBean> tipoProblemas;

	private List<List<String>> dadosGrafico;

	private String dataAteFiltro;

	private String dataDeFiltro;

	private Long tipoChamadoFiltro;

	private String destinoChamadoFiltro;

	private SimpleDateFormat dataFormat2;

	private String historicoTexto;

	private List<TipoProblemaBean> destinosFiltro;

	private List<UsuarioBean> solicitantesFiltro;

	private List<UsuarioBean> responsaveisFiltro;

	private Long solicitanteFiltro;

	private Long responsavelFiltro;

	private Long numeroChamadoFiltro;

	private String statusChamadoFiltro;

	private boolean checkEnviaEmailHistorico;

	private boolean checkTodosChamados;

	public GerenciaChamadoTela() {
		usuario = usuario == null ? (UsuarioBean) ((HttpSession) FacesContext
				.getCurrentInstance().getExternalContext().getSession(false))
				.getAttribute("usuario") : usuario;
		checkEnviaEmailHistorico = false;
		this.servico = new ChamadoServico<ChamadoBean>();
		this.usuarioServico = new UsuarioServico<UsuarioBean>();
		this.tipoServico = new TipoProblemaServico<TipoProblemaBean>();
		tipoProblema = new TipoProblemaBean();
		historico = new HistoricoBean();
		dataFormat2 = new SimpleDateFormat("dd/MM/yy");
		dataAteFiltro = dataFormat2.format(new Date());
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(new Date());
		calendar.add(Calendar.DATE, -30);
		dataDeFiltro = dataFormat2.format(calendar.getTime());
		destinosFiltro = new ArrayList<TipoProblemaBean>();
		solicitantesFiltro = new ArrayList<UsuarioBean>();
		responsaveisFiltro = new ArrayList<UsuarioBean>();
		checkTodosChamados = false;
		try {
			if (!usuario.getTipo().equals("Gerente")) {
				tipoProblemas = this.tipoServico.buscaTipos(usuario
						.getTipoChamado().trim());
				dadosGrafico = this.servico.estatisticaAssunto(usuario);
			} else {
				dadosGrafico = this.servico.estatisticaTI(usuario);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public boolean menuPermitido(String menu) {
		boolean permite = false;
		for (int i = 0; i < usuario.getListaMenus().size(); i++) {
			if (usuario.getListaMenus().get(i).equals(menu)) {
				permite = true;
				break;
			}
		}
		return permite;
	}

	public void buscaChamadosNApro() {

		try {
			Map<String, Object> parametros = new HashMap<String, Object>();
			if (usuario.getTipo().trim().equals("Coordenador")) {
				if (usuario.getTipoChamado().trim().equals("Hardware")) {
					parametros.put("DESTINOCHAMADO", usuario.getTipoChamado()
							+ "','Comunicação");
				} else if (usuario.getTipoChamado().trim().equals("Engenharia")) {
					parametros.put("DESTINOCHAMADO", usuario.getTipoChamado()
							+ "','Hardware");
				} else {
					parametros.put("DESTINOCHAMADO", usuario.getTipoChamado());
				}
			}
			this.chamadosNaoAprovados = this.servico.buscaChamadosNaoAprovados(
					parametros, usuario);
			preencheCombosFiltro(this.chamadosNaoAprovados);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void buscaFiltroAtendidos() {
		try {
			Map<String, Object> parametros = new HashMap<String, Object>();
			if (usuario.getTipo().trim().equals("Coordenador")) {
				if (usuario.getTipoChamado().trim().equals("Hardware")) {
					parametros.put("DESTINOCHAMADO", usuario.getTipoChamado()
							+ "','Comunicação");
				} else {
					parametros.put("DESTINOCHAMADO", usuario.getTipoChamado());
				}
			} else if (usuario.getTipo().trim().equals("Normal")) {
				parametros.put("RESPONSAVEL",
						Long.parseLong(usuario.getCodigo()));
			}
			this.solicitantesFiltro = this.usuarioServico
					.buscaSolicitantesAtendidos(parametros);
			this.responsaveisFiltro = this.usuarioServico
					.buscaResponsaveisAtendidos(parametros);
			Collections.sort(solicitantesFiltro);
			Collections.sort(responsaveisFiltro);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void preencheResponsaveis(String tipoChamado) {
		try {
			responsaveis = this.usuarioServico.buscaResponsaveis(tipoChamado,
					usuario);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void aprovaChamado() {
		FacesMessage msg = null;
		try {
			if (responsavel != 0) {
				final UsuarioBean resp = new UsuarioBean();
				UsuarioBean donoChamado = chamado.getUsuario();
				resp.setCodigo(responsavel.toString());
				chamado.setUsuarioResponsavel(resp);
				chamado.setUsuario(usuario);
				this.servico.aprovaChamado(chamado);
				chamado.setUsuario(donoChamado);
				enviaEmail("Chamado Aprovado", "");
				chamado = new ChamadoBean();
				// buscaChamadosNApro();
				filtrarNAprovados();
				msg = new FacesMessage(FacesMessage.SEVERITY_INFO, this
						.getServico().getValor("msg_header_sucesso"), this
						.getServico().getValor("msg_aprova_suce_cha"));
				RequestContext.getCurrentInstance().execute("dlg14.hide();");
			} else {
				msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, this
						.getServico().getValor("msg_header_erro"), this
						.getServico().getValor("msg_resp_obrigatorio"));
			}
		} catch (Exception e) {
			msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, this
					.getServico().getValor("msg_header_erro"), this
					.getServico().getValor("msg_aprova_erro_cha"));
			e.printStackTrace();
		}
		FacesContext.getCurrentInstance().addMessage(null, msg);
	}

	public void trocaDestinoChamado() {
		FacesMessage msg = null;
		String status = "";
		try {
			if (tipoProblema.getCodigo() != null
					&& tipoProblema.getCodigo() != 0) {
				if (tipoProblema.getDestinoChamado() != null
						&& tipoProblema.getDestinoChamado() != "0") {
					UsuarioBean donoChamado = chamado.getUsuario();
					chamado.setTipoProblema(tipoProblema);
					chamado.setUsuario(usuario);
					status = chamado.getStatus().trim();
					this.servico.trocaDestinoChamado(chamado);
					chamado.setUsuario(donoChamado);
					enviaEmail("Chamado Alterado", "");
					chamado = new ChamadoBean();
					if (status.equals("Aguardando Aprovação")) {
						filtrarNAprovados();
					} else {
						filtrarIniciar();
					}

					// buscaChamadosNApro();
					msg = new FacesMessage(FacesMessage.SEVERITY_INFO, this
							.getServico().getValor("msg_header_sucesso"), this
							.getServico().getValor("msg_troca_suce_cha"));
				} else {
					msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, this
							.getServico().getValor("msg_header_erro"), this
							.getServico().getValor("msg_sem_destino"));
				}
			} else {
				msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, this
						.getServico().getValor("msg_header_erro"), this
						.getServico().getValor("msg_sem_assunto"));
			}

		} catch (Exception e) {
			msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, this
					.getServico().getValor("msg_header_erro"), this
					.getServico().getValor("msg_troca_erro_cha"));
			e.printStackTrace();
		}
		FacesContext.getCurrentInstance().addMessage(null, msg);

	}

	public void negaChamado() {
		FacesMessage msg = null;
		try {
			List<HistoricoBean> historicos = new ArrayList<HistoricoBean>();
			historicos.add(historico);
			UsuarioBean donoChamado = chamado.getUsuario();
			chamado.setHistoricos(historicos);
			chamado.setUsuario(usuario);
			this.servico.negaChamado(chamado);
			chamado.setUsuario(donoChamado);
			if (checkEnviaEmailHistorico) {
				enviaEmail("Chamado Recusado", historico.getDescricao());
			} else {
				enviaEmail("Chamado Recusado", "");
			}
			chamado.setUsuario(donoChamado);
			historico = new HistoricoBean();
			historicos.remove(0);
			chamado = new ChamadoBean();
			filtrarNAprovados();
			msg = new FacesMessage(FacesMessage.SEVERITY_INFO, this
					.getServico().getValor("msg_header_sucesso"), this
					.getServico().getValor("msg_nega_suce_chamado"));
		} catch (Exception e) {
			msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, this
					.getServico().getValor("msg_header_erro"), this
					.getServico().getValor("msg_nega_erro_chamado"));
			e.printStackTrace();
		}
		FacesContext.getCurrentInstance().addMessage(null, msg);
	}

	public void filtraAtendidos() {
		Map<String, Object> param = new HashMap<String, Object>();
		if (this.dataDeFiltro != null && !"".equals(this.dataDeFiltro.trim())) {
			param.put("DATADE", this.dataDeFiltro.trim());
		}
		if (this.dataAteFiltro != null && !"".equals(this.dataAteFiltro.trim())) {
			param.put("DATAATE", dataAteFiltro.trim());
		}
		if (this.destinoChamadoFiltro != null
				&& !"0".equals(this.destinoChamadoFiltro)) {
			param.put("DESTINO", this.destinoChamadoFiltro.trim());
		}
		if (this.tipoChamadoFiltro.toString() != null
				&& !"0".equals(this.tipoChamadoFiltro.toString())) {
			param.put("ASSUNTO", this.tipoChamadoFiltro);
		}
		if (this.numeroChamadoFiltro != null && this.numeroChamadoFiltro != 0) {
			param.put("IDCHAMADO", this.numeroChamadoFiltro);
		}
		if (this.solicitanteFiltro != null && this.solicitanteFiltro != 0) {
			param.put("SOLICITANTE", this.solicitanteFiltro);
		}
		if (this.responsavelFiltro != null && this.responsavelFiltro != 0) {
			param.put("RESPONSAVEL", this.responsavelFiltro);
		}
		if(checkTodosChamados) {
			param.put("CHECKTODOS", "S");
		}
		try {
			this.chamadosAtendidos = this.servico.buscaChamadosAtendidos(param,
					usuario);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void buscaChamadosIniciar() {
		try {
			Map<String, Object> parametros = new HashMap<String, Object>();
			if (usuario.getTipo().trim().equals("Normal")) {
				parametros.put("RESPONSAVEL",
						Long.parseLong(usuario.getCodigo()));
				chamadosIniciar = this.servico.buscaChamadosIniciar(parametros,
						usuario);
			} else if (usuario.getTipo().trim().equals("Coordenador")) {
				if (usuario.getTipoChamado().trim().equals("Hardware")) {
					parametros.put("DESTINOCHAMADO", usuario.getTipoChamado()
							+ "','Comunicação");
				} else if (usuario.getTipoChamado().trim().equals("Engenharia")) {
					parametros.put("DESTINOCHAMADO", usuario.getTipoChamado()
							+ "','Hardware");
				} else {
					parametros.put("DESTINOCHAMADO", usuario.getTipoChamado());
				}
				chamadosIniciar = this.servico.buscaChamadosIniciar(parametros,
						usuario);
			} else {
				chamadosIniciar = this.servico.buscaChamadosIniciar(parametros,
						usuario);
			}
			preencheCombosFiltro(chamadosIniciar);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void preencheCombosFiltro(List<ChamadoBean> chamados)
			throws Exception {
		if (chamados != null) {
			this.destinosFiltro = new ArrayList<TipoProblemaBean>();
			this.solicitantesFiltro = new ArrayList<UsuarioBean>();
			this.responsaveisFiltro.clear();
			for (int i = 0; i < chamados.size(); i++) {
				boolean existe = false;
				if (this.destinosFiltro != null
						&& this.destinosFiltro.size() > 0) {
					for (int j = 0; j < this.destinosFiltro.size(); j++) {
						if (this.destinosFiltro
								.get(j)
								.getDestinoChamado()
								.trim()
								.equals(chamados.get(i).getTipoProblema()
										.getDestinoChamado().trim())) {
							existe = true;
							break;
						}
					}
					if (!existe) {
						this.destinosFiltro.add(chamados.get(i)
								.getTipoProblema());
					}
				} else {
					this.destinosFiltro.add(chamados.get(i).getTipoProblema());
				}
				existe = false;
				if (this.solicitantesFiltro != null
						&& this.solicitantesFiltro.size() > 0) {
					for (int j = 0; j < this.solicitantesFiltro.size(); j++) {
						if (this.solicitantesFiltro
								.get(j)
								.getNome()
								.trim()
								.equals(chamados.get(i).getUsuario().getNome()
										.trim())) {
							existe = true;
							break;
						}
					}
					if (!existe) {
						this.solicitantesFiltro.add(chamados.get(i)
								.getUsuario());
					}
				} else {
					this.solicitantesFiltro.add(chamados.get(i).getUsuario());
				}
				existe = false;
				if (this.responsaveisFiltro != null
						&& this.responsaveisFiltro.size() > 0) {
					for (int j = 0; j < this.responsaveisFiltro.size(); j++) {
						if (chamados.get(i).getUsuarioResponsavel() != null) {
							if (this.responsaveisFiltro.get(j) != null
									&& this.responsaveisFiltro
											.get(j)
											.getNome()
											.trim()
											.equals(chamados.get(i)
													.getUsuarioResponsavel()
													.getNome().trim())) {
								existe = true;
								break;
							}
						} else {
							existe = true;
							break;
						}
					}
					if (!existe) {
						this.responsaveisFiltro.add(chamados.get(i)
								.getUsuarioResponsavel());
					}
				} else {
					this.responsaveisFiltro.add(chamados.get(i)
							.getUsuarioResponsavel());
				}
			}
			if (this.destinosFiltro != null) {
				Collections.sort(this.destinosFiltro);
			}
			if (this.solicitantesFiltro != null) {
				Collections.sort(this.solicitantesFiltro);
			}
			if (this.responsaveisFiltro != null) {
				Collections.sort(this.responsaveisFiltro);
			}
		}
	}

	public void filtrarIniciar() {
		try {
			Map<String, Object> parametros = new HashMap<String, Object>();

			if (destinoChamadoFiltro != null
					&& !"0".equals(destinoChamadoFiltro.trim())) {
				parametros.put("DESTINOCHAMADO", destinoChamadoFiltro);
			} else {
				if (usuario.getTipoChamado().trim().equals("Desenvolvimento")) {
					parametros.put("DESTINOCHAMADO", "Desenvolvimento");
				} else if (usuario.getTipoChamado().trim().equals("Hardware")) {
					parametros.put("DESTINOCHAMADO", "Hardware','Comunicação");
				} else if (usuario.getTipoChamado().trim().equals("Engenharia")) {
					parametros.put("DESTINOCHAMADO", usuario.getTipoChamado()
							+ "','Hardware");
				} else {
					parametros.put("DESTINOCHAMADO", usuario.getTipoChamado());
				}
			}
			if (solicitanteFiltro != null && solicitanteFiltro != 0) {
				parametros.put("SOLICITANTE", solicitanteFiltro);
			}
			if (responsavelFiltro != null && responsavelFiltro != 0) {
				parametros.put("RESPONSAVEL", responsavelFiltro);
			} else {
				if (usuario.getTipo().trim().equals("Normal")) {
					parametros.put("RESPONSAVEL",
							Long.parseLong(usuario.getCodigo()));
				}
			}
			if ("Atendido".equals(statusChamadoFiltro)) {
				parametros.put("STATUS", "Atendido");
			} else if ("Atrasado".equals(statusChamadoFiltro)) {
				parametros.put("STATUS", "Atrasado");
			} else if ("Em Andamento".equals(statusChamadoFiltro)) {
				parametros.put("STATUS", "Em Andamento");
			} else if ("Não Iniciado".equals(statusChamadoFiltro)) {
				parametros.put("STATUS", "Não Iniciado");
			}
			chamadosIniciar = this.servico.buscaChamadosIniciar(parametros,
					usuario);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public void ordenaFinalizado() {
		Collections.sort(chamadosIniciar, new Comparator<ChamadoBean>() {
			public int compare(ChamadoBean o1, ChamadoBean o2) {
				int comp = o2.getProgresso().compareTo(o1.getProgresso());
				return comp;
			}
		});
	}

	public void ordenaAberto() {
		Collections.sort(chamadosIniciar, new Comparator<ChamadoBean>() {
			public int compare(ChamadoBean o1, ChamadoBean o2) {
				if (o1.getProgresso() == 0 && o1.getStatus().equals("Aberto")) {
					return -1;
				}
				return 0;
			}
		});
	}

	public void ordenaAndamentoAtrasado() {
		Collections.sort(chamadosIniciar, new Comparator<ChamadoBean>() {
			public int compare(ChamadoBean o1, ChamadoBean o2) {
				if (o1.getProgresso() != 100
						&& o1.getStatus().equals("Em Andamento")
						&& Ferramentas.formataData(
								Ferramentas.formataData(o1.getDataPrevisao()
										.getTime(), "dd/MM/yy"), "dd/MM/yy")
								.before(Ferramentas.formataData(Ferramentas
										.formataData(new Date().getTime(),
												"dd/MM/yy"), "dd/MM/yy"))) {
					return -1;

				}
				return 0;
			}
		});
	}

	public void ordenaAndamento() {
		Collections.sort(chamadosIniciar, new Comparator<ChamadoBean>() {

			public int compare(ChamadoBean o1, ChamadoBean o2) {
				if (o1.getProgresso() != 100
						&& o1.getStatus().equals("Em Andamento")
						&& Ferramentas.formataData(
								Ferramentas.formataData(o1.getDataPrevisao()
										.getTime(), "dd/MM/yy"), "dd/MM/yy")
								.getTime() >= Ferramentas.formataData(
								Ferramentas.formataData(new Date().getTime(),
										"dd/MM/yy"), "dd/MM/yy").getTime()) {
					return -1;
				}
				return 0;
			}
		});
	}

	public void filtrarNAprovados() {
		try {
			Map<String, Object> parametros = new HashMap<String, Object>();
			if (destinoChamadoFiltro != null
					&& !"0".equals(destinoChamadoFiltro.trim())) {
				parametros.put("DESTINOCHAMADO", destinoChamadoFiltro);
			} else {
				if (usuario.getTipoChamado().trim().equals("Desenvolvimento")) {
					parametros.put("DESTINOCHAMADO", "Desenvolvimento");
				} else if (usuario.getTipoChamado().trim().equals("Hardware")) {
					parametros.put("DESTINOCHAMADO", "Hardware','Comunicação");
				} else if (usuario.getTipoChamado().trim().equals("Engenharia")) {
					parametros.put("DESTINOCHAMADO", usuario.getTipoChamado()
							+ "','Hardware");
				} else {
					if (!usuario.getTipo().equals("Gerente")) {
						parametros.put("DESTINOCHAMADO",
								usuario.getTipoChamado());
					}
				}
			}
			if (solicitanteFiltro != null && solicitanteFiltro != 0) {
				parametros.put("SOLICITANTE", solicitanteFiltro);
			}
			if (numeroChamadoFiltro != null && numeroChamadoFiltro != 0) {
				parametros.put("IDCHAMADO", numeroChamadoFiltro);
			}
			this.chamadosNaoAprovados = this.servico.buscaChamadosNaoAprovados(
					parametros, usuario);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public void iniciaChamado() {
		FacesMessage msg = null;
		try {
			chamado.setUsuarioResponsavel(usuario);
			this.servico.iniciaChamado(chamado);
			enviaEmail("Chamado Iniciado", "");
			msg = new FacesMessage(FacesMessage.SEVERITY_INFO, this
					.getServico().getValor("msg_header_sucesso"), this
					.getServico().getValor("msg_inicia_suce_chamado"));
			filtrarIniciar();

		} catch (Exception e) {
			msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, this
					.getServico().getValor("msg_header_erro"), this
					.getServico().getValor("msg_inicia_erro_chamado"));
			e.printStackTrace();
		}
		FacesContext.getCurrentInstance().addMessage(null, msg);
	}

	private void enviaEmail(String assunto, String comentario) {
		try {
			List<String> destinos = this.usuarioServico.buscaEmails(chamado,
					"Altera");
			String destino = "";
			for (String dest : destinos) {
				destino += dest + ",";
			}
			Ferramentas.enviaEmail(
					Ferramentas.criaCorpoEmail(chamado, comentario), assunto,
					destino.substring(0, destino.trim().length() - 1),
					"CHAMADO");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void informaAndamento() {
		FacesMessage msg = null;
		try {
			List<HistoricoBean> historicos = new ArrayList<HistoricoBean>();
			historicos.add(historico);
			chamado.setHistoricos(historicos);
			chamado.setUsuarioResponsavel(usuario);
			this.servico.informaAndamento(chamado);
			if (checkEnviaEmailHistorico) {
				enviaEmail("Chamado em Andamento", historico.getDescricao());
			}
			chamado = new ChamadoBean();
			historico = new HistoricoBean();
			historicos = null;
			msg = new FacesMessage(FacesMessage.SEVERITY_INFO, this
					.getServico().getValor("msg_header_sucesso"), this
					.getServico().getValor("msg_andamento_suce"));
			filtrarIniciar();
		} catch (Exception e) {
			msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, this
					.getServico().getValor("msg_header_erro"), this
					.getServico().getValor("msg_andamento_erro"));
			e.printStackTrace();
		}
		FacesContext.getCurrentInstance().addMessage(null, msg);
	}

	public boolean verificaChamado(ChamadoBean chamado) {
		boolean permite = false;
		if (usuario.getCodigo().equals(
				chamado.getUsuarioResponsavel().getCodigo())) {
			if (chamado.getHistoricos().size() > 0) {
				if (chamado.getStatus().trim().equals("Em Andamento")
						&& chamado.getHistoricos()
								.get(chamado.getHistoricos().size() - 1)
								.getProgresso() != 100) {
					permite = true;
				}
			}
		}
		return permite;
	}

	public void preencheProgresso(ChamadoBean chamado) {
		this.historico.setProgresso(chamado.getHistoricos()
				.get(chamado.getHistoricos().size() - 1).getProgresso());
	}

	public void cancela() {
		historico = new HistoricoBean();
		chamado = new ChamadoBean();
	}

	public void preencheHistorico(ChamadoBean chamado) {
		this.historicoTexto = "";
		for (int i = 0; i < chamado.getHistoricos().size(); i++) {
			this.historicoTexto += Ferramentas.formataData(chamado
					.getHistoricos().get(i).getDataEmissao().getTime(),
					"dd/MM/yy HH:mm:ss")
					+ "("
					+ chamado.getHistoricos().get(i).getProgresso()
					+ "%) - "
					+ chamado.getHistoricos().get(i).getDescricao()
					+ "<br/>";
		}

	}

	public String pintaLinha(ChamadoBean chamado) {
		String classe = "";
		if (chamado != null && chamado.getDataEncerrado() != null) {
			if ((Ferramentas.formataData(
					Ferramentas.formataData(
							chamado.getDataPrevisao().getTime(), "dd/MM/yy"),
					"dd/MM/yy").getTime() >= (Ferramentas.formataData(
					Ferramentas.formataData(
							chamado.getHistoricos()
									.get(chamado.getHistoricos().size() - 1)
									.getDataEmissao().getTime(), "dd/MM/yy"),
					"dd/MM/yy")).getTime() && chamado.getQualificacao().equals(
					"Satisfeito"))) {
				classe = "LinhaComp";
			} else if ((Ferramentas.formataData(
					Ferramentas.formataData(
							chamado.getDataPrevisao().getTime(), "dd/MM/yy"),
					"dd/MM/yy").before(
					Ferramentas.formataData(
							Ferramentas.formataData(chamado.getHistoricos()
									.get(chamado.getHistoricos().size() - 1)
									.getDataEmissao().getTime(), "dd/MM/yy"),
							"dd/MM/yy")) && chamado.getQualificacao().equals(
					"Satisfeito"))) {
				classe = "LinhaNega";
			} else {
				classe = "LinhaRece";
			}
		}
		return classe;
	}

	public String pintaLinha2(ChamadoBean chamado) {
		String classe = "";
		if (chamado != null) {
			if (chamado.getProgresso() == 100) {
				classe = "LinhaComp";
			} else if (chamado.getProgresso() != 100
					&& chamado.getStatus().equals("Em Andamento")
					&& Ferramentas.formataData(
							Ferramentas.formataData(chamado.getDataPrevisao()
									.getTime(), "dd/MM/yy"), "dd/MM/yy")
							.before(Ferramentas.formataData(
									Ferramentas.formataData(
											new Date().getTime(), "dd/MM/yy"),
									"dd/MM/yy"))) {
				classe = "LinhaRece";
			} else if (chamado.getProgresso() != 100
					&& chamado.getStatus().equals("Em Andamento")
					&& Ferramentas.formataData(
							Ferramentas.formataData(chamado.getDataPrevisao()
									.getTime(), "dd/MM/yy"), "dd/MM/yy")
							.getTime() >= Ferramentas.formataData(
							Ferramentas.formataData(new Date().getTime(),
									"dd/MM/yy"), "dd/MM/yy").getTime()) {
				classe = "LinhaApro";
			} else {
				classe = "LinhaBloq";
			}
		}
		return classe;
	}

	public void atualizaGraficos() {
		try {
			if (usuario.getTipo().equals("Gerente")) {
				dadosGrafico = this.servico.estatisticaTI(usuario);
			} else if (usuario.getTipo().equals("Coordenador")) {
				dadosGrafico = this.servico.estatisticaAssunto(usuario);
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@SuppressWarnings("rawtypes")
	@Override
	protected IServicoGenerico getServico() {
		return this.servico;
	}

	public UsuarioBean getUsuario() {
		return usuario;
	}

	public void setUsuario(UsuarioBean usuario) {
		this.usuario = usuario;
	}

	public ChamadoBean getChamado() {
		return chamado;
	}

	public void setChamado(ChamadoBean chamado) {
		this.chamado = chamado;
	}

	public List<ChamadoBean> getChamadosNaoAprovados() {
		return chamadosNaoAprovados;
	}

	public void setChamadosNaoAprovados(List<ChamadoBean> chamadosNaoAprovados) {
		this.chamadosNaoAprovados = chamadosNaoAprovados;
	}

	public void setServico(ChamadoServico<ChamadoBean> servico) {
		this.servico = servico;
	}

	public UsuarioServico<UsuarioBean> getUsuarioServico() {
		return usuarioServico;
	}

	public void setUsuarioServico(UsuarioServico<UsuarioBean> usuarioServico) {
		this.usuarioServico = usuarioServico;
	}

	public List<UsuarioBean> getResponsaveis() {
		return responsaveis;
	}

	public void setResponsaveis(List<UsuarioBean> responsaveis) {
		this.responsaveis = responsaveis;
	}

	public Long getResponsavel() {
		return responsavel;
	}

	public void setResponsavel(Long responsavel) {
		this.responsavel = responsavel;
	}

	public TipoProblemaBean getTipoProblema() {
		return tipoProblema;
	}

	public void setTipoProblema(TipoProblemaBean tipoProblema) {
		this.tipoProblema = tipoProblema;
	}

	public HistoricoBean getHistorico() {
		return historico;
	}

	public void setHistorico(HistoricoBean historico) {
		this.historico = historico;
	}

	public TipoProblemaServico<TipoProblemaBean> getTipoServico() {
		return tipoServico;
	}

	public void setTipoServico(TipoProblemaServico<TipoProblemaBean> tipoServico) {
		this.tipoServico = tipoServico;
	}

	public List<ChamadoBean> getChamadosAtendidos() {
		return chamadosAtendidos;
	}

	public void setChamadosAtendidos(List<ChamadoBean> chamadosAtendidos) {
		this.chamadosAtendidos = chamadosAtendidos;
	}

	public List<TipoProblemaBean> getTipoProblemas() {
		return tipoProblemas;
	}

	public void setTipoProblemas(List<TipoProblemaBean> tipoProblemas) {
		this.tipoProblemas = tipoProblemas;
	}

	public String getDataAteFiltro() {
		return dataAteFiltro;
	}

	public void setDataAteFiltro(String dataAteFiltro) {
		this.dataAteFiltro = dataAteFiltro;
	}

	public String getDataDeFiltro() {
		return dataDeFiltro;
	}

	public void setDataDeFiltro(String dataDeFiltro) {
		this.dataDeFiltro = dataDeFiltro;
	}

	public Long getTipoChamadoFiltro() {
		return tipoChamadoFiltro;
	}

	public void setTipoChamadoFiltro(Long tipoChamadoFiltro) {
		this.tipoChamadoFiltro = tipoChamadoFiltro;
	}

	public String getDestinoChamadoFiltro() {
		return destinoChamadoFiltro;
	}

	public void setDestinoChamadoFiltro(String destinoChamadoFiltro) {
		this.destinoChamadoFiltro = destinoChamadoFiltro;
	}

	public List<ChamadoBean> getChamadosIniciar() {
		return chamadosIniciar;
	}

	public void setChamadosIniciar(List<ChamadoBean> chamadosIniciar) {
		this.chamadosIniciar = chamadosIniciar;
	}

	public SimpleDateFormat getDataFormat2() {
		return dataFormat2;
	}

	public void setDataFormat2(SimpleDateFormat dataFormat2) {
		this.dataFormat2 = dataFormat2;
	}

	public String getHistoricoTexto() {
		return historicoTexto;
	}

	public void setHistoricoTexto(String historicoTexto) {
		this.historicoTexto = historicoTexto;
	}

	public List<List<String>> getDadosGrafico() {
		return dadosGrafico;
	}

	public void setDadosGrafico(List<List<String>> dadosGrafico) {
		this.dadosGrafico = dadosGrafico;
	}

	public List<TipoProblemaBean> getDestinosFiltro() {
		return destinosFiltro;
	}

	public void setDestinosFiltro(List<TipoProblemaBean> destinosFiltro) {
		this.destinosFiltro = destinosFiltro;
	}

	public List<UsuarioBean> getSolicitantesFiltro() {
		return solicitantesFiltro;
	}

	public void setSolicitantesFiltro(List<UsuarioBean> solicitantesFiltro) {
		this.solicitantesFiltro = solicitantesFiltro;
	}

	public List<UsuarioBean> getResponsaveisFiltro() {
		return responsaveisFiltro;
	}

	public void setResponsaveisFiltro(List<UsuarioBean> responsaveisFiltro) {
		this.responsaveisFiltro = responsaveisFiltro;
	}

	public Long getSolicitanteFiltro() {
		return solicitanteFiltro;
	}

	public void setSolicitanteFiltro(Long solicitanteFiltro) {
		this.solicitanteFiltro = solicitanteFiltro;
	}

	public Long getResponsavelFiltro() {
		return responsavelFiltro;
	}

	public void setResponsavelFiltro(Long responsavelFiltro) {
		this.responsavelFiltro = responsavelFiltro;
	}

	public Long getNumeroChamadoFiltro() {
		return numeroChamadoFiltro;
	}

	public void setNumeroChamadoFiltro(Long numeroChamadoFiltro) {
		this.numeroChamadoFiltro = numeroChamadoFiltro;
	}

	public String getStatusChamadoFiltro() {
		return statusChamadoFiltro;
	}

	public void setStatusChamadoFiltro(String statusChamadoFiltro) {
		this.statusChamadoFiltro = statusChamadoFiltro;
	}

	public boolean isCheckEnviaEmailHistorico() {
		return checkEnviaEmailHistorico;
	}

	public void setCheckEnviaEmailHistorico(boolean checkEnviaEmailHistorico) {
		this.checkEnviaEmailHistorico = checkEnviaEmailHistorico;
	}

	public boolean isCheckTodosChamados() {
		return checkTodosChamados;
	}

	public void setCheckTodosChamados(boolean checkTodosChamados) {
		this.checkTodosChamados = checkTodosChamados;
	}
}
